home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 726-750 / 729 / bbbbs / bbbbs54.lzh / rexx / ArcMsgs.rexx < prev    next >
OS/2 REXX Batch file  |  1992-07-15  |  7KB  |  292 lines

  1. /*    $VER: 5.3 ArcMsgs.rexx 15 Jul 1992 (15.7.92)
  2. archives unread conference messages into file in users email
  3. copyright 1991-92 Richard Lee Stockton  FREELY DISTRIBUTABLE
  4. */
  5.  
  6. SIGNAL ON BREAK_C
  7. SIGNAL ON ERROR
  8. SIGNAL ON SYNTAX
  9. OPTIONS FAILAT 999999
  10.  
  11. PARSE ARG name' 'single_dir' '.
  12. IF STRIP(single_dir)='' THEN single_dir=0
  13. IF name='' THEN CALL GETOUT(20)
  14.  
  15. CALL CLOSE(STDOUT)
  16. CALL OPEN(STDOUT,'RAM:ArcMsgs.STDOUT','W')
  17.  
  18. figarg='s:CONFIG.BBS'
  19. IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
  20. x=OPEN(f,figarg,'R')
  21. IF x=0 THEN
  22.   DO
  23.     SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
  24.     CALL GETOUT(21)
  25.   END
  26.  
  27. data.=''
  28. DO i=1 TO 33
  29.   data.i=READLN(f)
  30. END
  31. CALL CLOSE(f)
  32.  
  33. compos=POS('/*',data.1)
  34. IF compos>0 THEN data.1=LEFT(data.1,compos-1)
  35. bbsname = STRIP(data.1)
  36. sysop   = WORD(data.2,1)
  37. bbspath = WORD(data.6,1)
  38. IF ~EXISTS(bbspath) THEN
  39.   DO
  40.     SAY bbspath 'does not exist!'
  41.     CALL GETOUT(22)
  42.   END
  43. testchar=RIGHT(bbspath,1)
  44. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  45.  
  46. msgpath = WORD(data.7,1)
  47. IF ~EXISTS(msgpath) THEN
  48.   DO
  49.     SAY msgpath 'does not exist!'
  50.     CALL GETOUT(23)
  51.   END
  52. testchar=RIGHT(msgpath,1)
  53. IF testchar~='/' & testchar~=':' THEN msgpath=msgpath'/'
  54. msgpath=msgpath'MSG'
  55.  
  56. extension=WORD(data.32,1)
  57. arccom=data.33
  58. compos=POS('/*',data.33)
  59. IF compos>0 THEN data.33=LEFT(data.33,compos-1)
  60. arccom=STRIP(data.33)
  61. IF LEFT(extension,1)~='.' THEN
  62.   DO
  63.     extension='.lzh'
  64.     arccom='lharc -m m'
  65.   END
  66.  
  67. x=OPEN(f,bbspath'Users/'name,'R')
  68. IF x=0 THEN
  69.   DO
  70.     CALL DELAY(150)
  71.     x=OPEN(f,bbspath'Users/'name,'R')
  72.     IF x=0 THEN
  73.       DO
  74.         SAY name 'user file is missing!'
  75.         CALL GETOUT(24)
  76.       END
  77.   END
  78. data.=''
  79. DO i=1 TO 25
  80.   data.i=READLN(f)
  81. END
  82. CALL CLOSE(f)
  83. level=data.20%1
  84. lastread.=0
  85.  
  86. msg.=''
  87. IF readopen(bbspath'Lists/Conferences') THEN
  88.   DO
  89.     DO i=1
  90.       line=READLN(f)
  91.       IF line='END' THEN BREAK
  92.       IF EOF(f) THEN BREAK
  93.       num=WORD(line,1)
  94.       IF DATATYPE(num,'N') THEN msg.num=WORD(line,2)
  95.     END
  96.     CALL CLOSE(f)
  97.   END
  98. CALL SETCLIP('BBS_MSGS')
  99.  
  100. CALL PRAGMA('P',-2)         /* lower the priority of this task */
  101.  
  102. x=OPEN(f,bbspath'Numbers/LastMail','R')
  103. IF x~=0 THEN lastm=READLN(f)+1
  104. CALL CLOSE(f)
  105. ADDRESS COMMAND 'ECHO >'bbspath'Numbers/LastMail 'lastm
  106.  
  107. filepath=bbspath'EmailFiles/'name
  108. CALL MAKEDIR(filepath)
  109. arcname=filepath'/BBBBS_'lastm
  110. x=OPEN(a,arcname,'W')
  111. IF x=0 THEN CALL GETOUT(30)
  112.  
  113. CALL WRITELN(a,'= Custom archived for' name)
  114. CALL WRITELN(a,'=' bbsname  'conference messages to' DATE('W') DATE() TIME('C'))
  115. CALL WRITELN(a,'')
  116. CALL newmsgs()
  117.  
  118. CALL CLOSE(a)
  119. CALL DELAY(28)
  120. IF WORD(STATEF(arcname),2)<80 THEN CALL GETOUT(24)
  121.  
  122. ADDRESS COMMAND arccom arcname||extension arcname
  123. x=OPEN(f,bbspath'Email/'name'/BBBBS.'lastm,'W')
  124. IF x=0 THEN CALL GETOUT(26)
  125. subj='All New Conference Messages'
  126. IF single_dir>0 THEN subj=msg.single_dir' conference messages.'
  127. CALL WRITELN(f,' Mail: 'lastm'   FILE: BBBBS_'lastm||extension)
  128. CALL WRITELN(f,' From: BBBBS')
  129. CALL WRITELN(f,'   To: 'name)
  130. CALL WRITELN(f,' Subj: 'subj)
  131. CALL WRITELN(f,' Date: 'DATE('W') DATE() TIME('C'))
  132. CALL WRITELN(f,LEFT('=',75,'='))
  133. CALL WRITELN(f,'Here are the archived new messages you requested.')
  134. CALL CLOSE(f)
  135. IF GETCLIP('BBS_level')~='' & WORD(GETCLIP('BBS_lastcaller'),1)=name THEN
  136.   DO
  137.     oldmess=GETCLIP('BBS_MESSAGE')
  138.     IF oldmess~='' THEN oldmess=oldmess||'0D0A'x
  139.     CALL SETCLIP('BBS_MESSAGE',oldmess||'Your archived messages are waiting in Email.')
  140.   END
  141. CALL GETOUT(0)
  142. EXIT
  143.  
  144.  
  145. /* Functions */
  146.  
  147. countcheck:
  148. PARSE ARG fname' '.
  149. IF ~readopen(fname) THEN RETURN(cknum)
  150. retval=STRIP(READLN(f))
  151. CALL CLOSE(f)
  152. IF ~DATATYPE(retval,'N') THEN retval=0
  153. RETURN(retval)
  154.  
  155.  
  156. newmsgs:
  157. IF single_dir>0 THEN
  158.   DO
  159.     msgdir=single_dir
  160.     CALL readmsg()
  161.     RETURN
  162.   END
  163. CALL WRITELN(a,'Scanning all Conferences for new messages..')
  164. DO newi=1 TO level
  165.   IF msg.newi='' THEN ITERATE newi
  166.   msgdir=newi
  167.   CALL readmsg()
  168. END
  169. RETURN
  170.  
  171.  
  172. readmsg:
  173. IF msg.msgdir='' | FIND(data.21,msgdir)>0 THEN RETURN;   /* sysop excluded */
  174. IF WORD(data.22,msgdir)=-1 THEN RETURN;  /*  user excluded */
  175. IF DATATYPE(WORD(data.22,msgdir),'N') THEN
  176.   lastread.msgdir=WORD(data.22,msgdir)
  177. lstwrt=countcheck(bbspath'Numbers/LastMessage'msgdir 0)
  178. frstwrt=countcheck(bbspath'Numbers/FirstMessage'msgdir 0)
  179. temp=''
  180. IF lastread.msgdir>=lstwrt THEN
  181.   DO
  182.     lastread.msgdir=lstwrt
  183.     RETURN
  184.   END
  185. CALL WRITELN(a,'Entering' msg.msgdir 'Message Conference..')
  186. dirname=msgpath||msgdir
  187. msglist.=0 /* set read to 0, unread to 1, and reply >=2 */
  188. firstmess=999999
  189. testlist=SHOWDIR(dirname)
  190. DO i=1 TO WORDS(testlist)
  191.   test=WORD(testlist,i)
  192.   IF test>lastread.msgdir THEN msglist.test=1
  193.   IF test<firstmess THEN firstmess=test
  194. END
  195. IF firstmess=999999 THEN firstmess=0
  196. CALL countcheck(bbspath'Numbers/FirstMessage'msgdir firstmess)
  197. msgstatus=1
  198. DO msgloop=1
  199.   lastreadnum=lastread.msgdir
  200.   DO WHILE msglist.lastreadnum=0 & lastreadnum<lstwrt
  201.     lastreadnum=lastreadnum+1
  202.   END
  203.   lastread.msgdir=lastreadnum
  204.   IF lastreadnum=lstwrt & msglist.lstwrt=0 THEN RETURN
  205.   DO mess=lastread.msgdir TO lstwrt+1
  206.     IF msglist.mess~=msgstatus THEN ITERATE mess
  207.     IF msgstatus>1 THEN CALL WRITELN(a,'Following the thread, level' msgstatus-1'.')
  208.     msglist.mess=0
  209.     arg=dirname'/'mess
  210.     IF ~EXISTS(arg) THEN
  211.       DO
  212.         CALL WRITELN(a,'Message number' mess 'is missing.')
  213.         ITERATE mess
  214.       END
  215.     IF ~readopen(arg) THEN ITERATE mess
  216.     firstline  = READLN(f)
  217.     secondline = READLN(f)
  218.     thirdline  = READLN(f)
  219.     forthline  = READLN(f)
  220.     CALL CLOSE(f)
  221.     IF WORDS(firstline)>2 THEN  /* if replies, change their num to >1 */
  222.       DO
  223.         thread=SUBSTR(firstline,WORDINDEX(firstline,4))
  224.         DO tindx=1 TO WORDS(thread)
  225.           test=WORD(thread,tindx)
  226.           IF msglist.test~=0 THEN msglist.test=msgstatus+1
  227.         END
  228.       END
  229.     CALL add_msg(arg)
  230.     IF thread~='' THEN
  231.        DO
  232.          thread=''
  233.          msgstatus=msgstatus+1
  234.        END
  235.   END
  236.   IF msgstatus>1 THEN msgstatus=msgstatus-1
  237. END
  238. RETURN
  239.  
  240.  
  241. readopen:
  242. PARSE ARG fname
  243. ok=OPEN(f,fname,'R')
  244. IF ok~=0 THEN RETURN(1)
  245. SAY fname 'failed to open for reading!'
  246. RETURN(0)
  247.  
  248.  
  249. readlines:
  250. CALL CLOSE(f)
  251. PARSE ARG tempname readstart .
  252. IF ~readopen(tempname) THEN RETURN(1)
  253. IF readstart<2 THEN lynes.=''
  254. DO ri=readstart
  255.   line=READLN(f)
  256.   IF EOF(f) THEN BREAK
  257.   lynes.ri=line
  258. END
  259. lynes.0=ri-1
  260. RETURN
  261.  
  262.  
  263. add_msg:
  264. ARG addname .
  265. x=OPEN(b,addname,'R')
  266. IF x=0 THEN SAY addname 'failed to open for reading!'
  267. ELSE
  268.   DO
  269.     data=READCH(b,65000)
  270.     CALL CLOSE(b)
  271.     CALL WRITECH(a,data)
  272.   END
  273. CALL WRITELN(a,'')
  274. CALL WRITELN(a,'')
  275. RETURN
  276.  
  277.  
  278. BREAK_C:
  279. SAY 'BREAK_C at line' SIGL
  280. CALL GETOUT(1)
  281.  
  282.  
  283. ERROR:
  284. SYNTAX:
  285. GETOUT:
  286. ARG errorout
  287. CALL SETCLIP('BBS_MSGS')
  288. IF errorout>0 | RC>0 THEN SAY 'Error:' errorout'  RC='RC'  SIGL='SIGL
  289. EXIT(errorout)
  290.  
  291. /* end of ArcMsgs.rexx */
  292.